package com.witsight.platform.util.lang;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.apache.commons.lang3.reflect.MethodUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.framework.AopProxyUtils;

/**   
 * 说明：方法工具类
 * 
 * @Title: MethodUtil.java 
 * @Package com.witsight.platform.util.lang 
 * @See: {@link MethodUtils}
 * Copyright: Copyright (c) 2017
 * Company:sany huax witsight team by product
 * @author: penght  
 * @date: 2017年9月11日 下午3:23:57 
 * @version: V1.0
 *
 */
public class MethodUtil extends MethodUtils {
	/**
	 * 说明：定义后能再同一类中使用static常量log
	 */
	private static final Logger log = LoggerFactory.getLogger(MethodUtil.class);
	/**
	 * 
	 * 说明： 代理处理方法
	 * @Title: proxyMethodHandle
	 * @See: {@link #proxyMethodHandle(Object, Object[], String, Class...)}
	 * @author penght
	 * @param proxy 代理实例对象
	 * @param params 设置的参数
	 * @param methodName 方法名
	 * @param parameterTypes 方法类型
	 * @param <T> 范型
	 * @return 返回代理对象
	 * @date: 2016年10月16日 下午4:51:58
	 */
	public static <T> T proxyMethodHandle(T proxy,Object[] params, String methodName,Class<?>... parameterTypes){
		try {
			// 取得代理类处理器
			InvocationHandler invocationHandler = Proxy.getInvocationHandler(proxy);
			// 取得需要反射的方法
			Method method = AopProxyUtils.ultimateTargetClass(proxy).getMethod(methodName, parameterTypes);
			// 设置模板路径
			invocationHandler.invoke(proxy, method, params);
		} catch (Exception e) {
			if (log.isErrorEnabled()) {
				log.error("proxy method handle error.", e);
			}
		} catch (Throwable e) {
			if (log.isErrorEnabled()) {
				log.error("proxy method handle error.", e);
			}
		}
		return proxy;
	}
	
	
}
